package cn.huaqingcheng.tool.json;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.io.Serializable;
import java.util.List;

/**
 * JsonProvide
 */
@SuppressWarnings("unused")
public interface JsonProvide extends Comparable<JsonProvide>, Serializable {

    @Override
    default int compareTo(@NotNull JsonProvide o) {
        return order() - o.order();
    }

    /**
     * 排序 {@link Integer#MAX_VALUE} 优先级最低
     *
     * @see #compareTo(JsonProvide)
     */
    default int order() {
        return Integer.MAX_VALUE;
    }

    /**
     * 转换为格式化 (一般至缩进) 后的 JSON 字符串
     *
     * @implNote 默认实现等同于 {@link #toJson(Object)}
     */
    @NotNull
    default String toFormatJson(@Nullable Object o) {
        return toJson(o);
    }

    /**
     * 转换为格式紧凑的 JSON 字符串
     */
    @NotNull
    String toJson(@Nullable Object o);

    /**
     * 解析 JSON
     *
     * @throws RuntimeException 任何解析错误包装
     */
    <T> T parse(@Nullable String json, @NotNull Class<T> tClass);

    /**
     * 解析 JSON
     *
     * @throws RuntimeException 任何解析错误包装
     */
    <E> List<E> parseList(@Nullable String json, @NotNull Class<E> type);

}
